package moduloTutor;

import java.util.Random;

import moduloAluno.Habilidades;
import moduloConhecimento.Conhecimento;
import moduloConhecimento.nivel.NaoPerteceNenhumNivelException;
import util.Constantes;

public class Tutor
{
	private int nivel;
	
	public Tutor()
	{
		setNivel(0);
	}

	public Tutor(int nivelAtual)
	{
		setNivel(nivelAtual);
	}

	private void setNivel(int nivelAtual)
	{
		nivel = nivelAtual;
	}
	
	public int getNivel()
	{
		return(nivel);
	}
	
	public Exercicio avalia(String fraseAluno, Conhecimento conhecimento) throws NaoPerteceNenhumNivelException
	{
		int i;
		int[] acumuladorNiveis;
		Exercicio exercicio;
		String fraseCorreta = conhecimento.getFrases().getFrase();

		acumuladorNiveis = new int[conhecimento.getRepNiveis().getQtdNiveis()];
		
		// verifica quais letras o elemento errou
		for (i = 0; i < fraseCorreta.length(); i++)
			if ((fraseAluno.charAt(i) != fraseCorreta.charAt(i)) && (fraseCorreta.charAt(i) != ' '))
				acumuladorNiveis[conhecimento.getRepNiveis().nivelPertencente(
						fraseCorreta.charAt(i)).getId()]++;
		
		exercicio = verificaPiorErros(conhecimento, acumuladorNiveis);

		return (exercicio);
	}

	private String gerarNovaTarefa(String subNivel)
	{
		Random aleatorio = new Random();
		String novoExercicio = new String();
		
		//de acordo com o tamanho pre-definido, gera uma string aleotoria com o exercicio
		for (int i = 0; i < Constantes.TAMANHO_STRING_EXERCICIO; i++)
			novoExercicio += subNivel.charAt(aleatorio.nextInt(subNivel.length()));

		return (novoExercicio);
	}

	private Exercicio verificaPiorErros(Conhecimento conhecimento,
			int[] acumuladorNiveis)
	{
		int i, j, nivelMaisErros;
		nivelMaisErros = -1;
		Exercicio novaTarefa;
		j = 0;

		// procura qual o nivel mais errado
		for (i = 0; i < acumuladorNiveis.length; i++)
			if (j < acumuladorNiveis[i])
			{
				j = acumuladorNiveis[i];
				nivelMaisErros = i;
			}

		// se nao houve erros, nao tem tarefa, logo, passa pra proxima frase
		if (nivelMaisErros == -1)
			novaTarefa = new Exercicio(null);
		else
			novaTarefa = new Exercicio(gerarNovaTarefa(conhecimento.getRepNiveis()
					.procurarNivel(nivelMaisErros).getNivel()));

		return (novaTarefa);
	}

	public Exercicio getProximoNivel(Conhecimento conhecimento)
	{
		Exercicio exercicio;
		int nivelTemp = getNivel();
		nivelTemp++;
		
		setNivel(nivelTemp);
		conhecimento.getFrases().atualizarFrase(nivelTemp);
		exercicio = new Exercicio(conhecimento.getFrases().getFrase());
		
		return(exercicio);
	}
	
	public Exercicio getNivelAtual(Conhecimento conhecimento)
	{
		Exercicio exercicio;
		int nivelTemp = getNivel();
		
		conhecimento.getFrases().atualizarFrase(nivelTemp);
		exercicio = new Exercicio(conhecimento.getFrases().getFrase());
		
		return(exercicio);
	}
	
	
	public Habilidades avaliaHabilidades(String fraseCorreta, String fraseAluno,
			Conhecimento conhecimento)
	{
		Habilidades habilidades;
		boolean correto = false;
		int linha = 0;
		int contadorLinha1 = 0;
		int contadorLinha2 = 0;
		int contadorLinha3 = 0;
		int contadorLinha4 = 0;
		int acertosLinha1 = 0;
		int acertosLinha2 = 0;
		int acertosLinha3 = 0;
		int acertosLinha4 = 0;
		double skill1 = 0.0;
		double skill2 = 0.0;
		double skill3 = 0.0;
		double skill4 = 0.0;

		for (int i = 0; i < fraseCorreta.length(); i++)
		{
			char letraCorreta = fraseCorreta.charAt(i);
			char letraAluno = fraseAluno.charAt(i);
			linha = conhecimento.getLinhaLetra("" + letraCorreta);

			if (letraCorreta == letraAluno)
			{
				correto = true;
			}
			else
			{
				correto = false;
			}

			switch (linha)
			{
				case 1:
					contadorLinha1++;
					if (correto)
						acertosLinha1++;
					break;
				case 2:
					contadorLinha2++;
					if (correto)
						acertosLinha2++;
					break;
				case 3:
					contadorLinha3++;
					if (correto)
						acertosLinha3++;
					break;
				case 4:
					contadorLinha4++;
					if (correto)
						acertosLinha4++;
					break;
			}

		}

		if (contadorLinha1 != 0)
			skill1 = ((double) acertosLinha1 / (double) contadorLinha1);
		if (contadorLinha2 != 0)
			skill2 = ((double) acertosLinha2 / (double) contadorLinha2);
		if (contadorLinha3 != 0)
			skill3 = ((double) acertosLinha3 / (double) contadorLinha3);
		if (contadorLinha4 != 0)
			skill4 = ((double) acertosLinha4 / (double) contadorLinha4);

		habilidades = new Habilidades(skill1, skill2, skill3, skill4);
		return habilidades;
	}
}
